package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo14_3_案例测试wait被notify通知过早的解决方案 {
    //
    //案例测试wait被notify通知过早的解决方案
    //案例测试wait被notify通知过早的解决方案
    //案例测试wait被notify通知过早的解决方案
    // 1,上一案例演示了《wait被notify通知过早》造成的逻辑不合理，这一案例来解决。
    // 2,把上一案例复制过来，为MyYellow类添加boolean myFlag = false;
    //   和while(myFlag == false){};
    // 3,在main中尝试先运行wait()再运行notify(),能够正常唤醒。
    //   在main中尝试先运行notify()再运行wait(),能够正常实现wait()不会执行。
    //   wait()不执行才符合逻辑。
    public static void main(String[] args) throws InterruptedException {
        MyYellow yellow = new MyYellow();
        Thread w = new Thread(yellow.r1);
        Thread n = new Thread(yellow.r2);

        w.start();
        Thread.sleep(1000);
        n.start();
    }
}

class MyYellow{
    String lock = "刘景景";
    boolean myFlag = false;
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            try {
                synchronized (lock){
                    while(myFlag == false){
                        System.out.println("开始wait()");
                        lock.wait();
                        System.out.println("结束wait()");
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    Runnable r2 = new Runnable() {
        @Override
        public void run() {
            synchronized (lock){
                System.out.println("开始notify()");
                lock.notify();
                System.out.println("结束notify()");
                myFlag = true;
            }
        }
    };
}

























